04. 构造函数和文件组织
构造你的函数
在上一课中,你学习了两种不同的函数声明和定义的方法:
*在 main() 上方声明函数,并在 main 下方定义函数
*在 main() 上方同时声明并定义函数
随着 C++ 程序变得越来越复杂,你可能需要将代码分成多个文件。分开保存函数定义和声明有助于分割并组织你的代码。
我们看看上一课的函数测验中的这段代码。
# include <iostream>
float distance(float velocity, float acceleration, float time_elapsed);
int main() {
std::cout << distance(3, 4, 5) << std::endl;
std::cout << distance(7.0, 2.1, 5.4) << std::endl;
return 0;
}
float distance(float velocity, float acceleration, float time_elapsed) {
return velocity*time_elapsed + 0.5*acceleration*time_elapsed*time_elapsed;
}
代码被组织成两个文件,而不是像以前的测验一样将所有内容都放到 main.cpp 中。看看下面的代码,然后点击“测试运行”按钮。
Start Quiz:
#include <iostream>
float distance(float velocity, float acceleration, float time_elapsed);
int main() {
std::cout << distance(3, 4, 5) << std::endl;
std::cout << distance(7.0, 2.1, 5.4) << std::endl;
return 0;
}
float distance(float velocity, float acceleration, float time_elapsed) {
return velocity*time_elapsed + 0.5*acceleration*time_elapsed*time_elapsed;
}
在后台,main.cpp 和 distance.cpp 正在编译。由于编译发生在教室的后端,所以你不到。
但是,如果你要在本地运行此程序,则可以打开一个终端并导航到包含这两个文件的文件夹。输入以下命令
g++ main.cpp distance.cpp
./a.out
即可一起编译两个文件,然后执行该程序。
由于你已经将函数定义在 main.cpp 之外的独立文件中,因此可以更轻松地在代码的其他部分重用该函数。
头文件
函数声明
float distance(float velocity, float acceleration, float time_elapsed);
通常也会单独创建一个文件。声明保存在所谓的 头文件 中,因为头是 main() 函数上方的信息。头文件扩展名通常为 .h 或 .hpp。下面的代码与上面相同,但在头文件中有函数声明。点击“测试运行”按钮,你会看到这个代码也能运行:
Start Quiz:
#include <iostream>
#include "distance.h"
int main() {
std::cout << distance(3, 4, 5) << std::endl;
std::cout << distance(7.0, 2.1, 5.4) << std::endl;
return 0;
}
float distance(float velocity, float acceleration, float time_elapsed) {
return velocity*time_elapsed + 0.5*acceleration*time_elapsed*time_elapsed;
}
float distance(float velocity, float acceleration, float time_elapsed);
代码行
# include "distance.h"
将 distance.h 的内容粘贴到 main.cpp 中。
现在,我们假设你想在不同的文件中重用你的 distance 函数。你所要做的,就是使用 include 语句在新文件的顶部声明函数:
# include "distance.h"
然后就可以在程序的另一部分使用该函数了。
将代码组织到不同的 .cpp 文件中,可以把声明与实现分离。此外,使用头文件意味着你不必记住如何进行函数声明,因为你可以用简单的语法将其包含在内
# include "distance"
要编译代码,只需要编译 .cpp文件而不是 .h 文件即可:
g++ main.cpp distance.cpp
文件命名
命名约定规定,头文件和相关的 cpp 文件需使用相同的名称。因此,很显然,distance.h 包含了 distance.cpp 的头部声明。你还会注意到,函数本身名称为 distance()。因此,函数名、.cpp 文件和 .h 文件都是匹配的。
这些是命名约定。如果你不遵循这些约定,你的 C++代码仍然会被编译;但我们强烈建议你遵循这些约定。
Include 语法
你可能想知道,为什么有两种不同类型的 include 语句:
# include <iostream>
# include "distance.h"
带引号的 include 语句告诉程序在当前目录中查找 distance.h 文件。
<> 语法则取决于你的 C++ 环境。通常,环境被设置为查找存储 C++ 库的文件,如标准库。
文件类型和定义
QUIZ QUESTION: :
每种文件类型中包括哪种代码类型?
ANSWER CHOICES:
代码 |
文件类型 |
---|---|
main.cpp |
|
function.h |
|
function.cpp |
SOLUTION:
代码 |
文件类型 |
---|---|
main.cpp |
|
function.h |
|
function.cpp |